package co.gov.aerocivil.siga.registrarquejaservicioaerolinea.servicio.impl;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import co.gov.aerocivil.siga.accesobd.servicio.IBuscadorServicio;
import co.gov.aerocivil.siga.comun.bean.IMensaje;
import co.gov.aerocivil.siga.comun.excepcion.LogicaExcepcion;
import co.gov.aerocivil.siga.comun.excepcion.SistemaExcepcion;
import co.gov.aerocivil.siga.comun.modelo.administrador.Estado;
import co.gov.aerocivil.siga.comun.modelo.administrador.Persona;
import co.gov.aerocivil.siga.comun.modelo.administrador.TipoSolicitud;
import co.gov.aerocivil.siga.comun.modelo.quejaaerolinea.QuejaAerolinea;
import co.gov.aerocivil.siga.comun.servicio.IGeneradorCodigoServicio;
import co.gov.aerocivil.siga.comun.servicio.IResponsableComunServicio;
import co.gov.aerocivil.siga.comun.servicio.administrador.ITipoSolicitudServicio;
import co.gov.aerocivil.siga.comun.servicio.auditoria.ILogError;
import co.gov.aerocivil.siga.integracion.servicio.IADIServicio;
import co.gov.aerocivil.siga.integracion.servicio.ISistemaDeArchivoServicio;
import co.gov.aerocivil.siga.registrarquejaservicioaerolinea.servicio.IQuejaAerolineaServicio;
import co.gov.aerocivil.siga.registrarquejaservicioaerolinea.servicio.IRegistrarQuejaAerolinea;
import co.gov.aerocivil.siga.registrarquejaservicioaerolinea.util.ConstantesValidacion;

/**
 * Clase que implementa la lógca de negocio de la entidad RegistrarQuejaAerolinea
 * @author lfcortes 	
 */
@Stateless
public class RegistrarQuejaAerolinea implements IRegistrarQuejaAerolinea {
	/**
	 * Inyeccion EJB del servicio ADIServicio
	 */
	@EJB
	private IADIServicio adiServicio;
	
	/**
	 * Inyeccion EJB del servicio GeneradorCodigoServicio
	 */
	@EJB
	private IGeneradorCodigoServicio codigoServicio;
	
	/**
	 * Inyeccion EJB del servicio ResponsableComunServicio
	 */
	@EJB
	private IResponsableComunServicio responsableServicio;
	
	/**
	 * Inyeccion EJB del servicio ResponsableComunServicio
	 */
	@EJB
	private IQuejaAerolineaServicio quejaAerolineaServicio;
	
	/**
	 * Inyeccion EJB del servicio transversal SistemaDeArchivoServicio
	 */
	@EJB
	private ISistemaDeArchivoServicio sistemaDeArchivoServicio;
	
	/**
	 * Inyección CDI del bean de aplicación de Mensajes
	 */
	@Inject
	private IMensaje mensaje;
	
	/**
	 * Inyección de servicios para buscar servicios
	 */
	@EJB
	protected IBuscadorServicio buscadorServicio;
	
	/**
	 * Inyeccion EJB del servicio TipoSolicitudServicio
	 */
	@EJB
	private ITipoSolicitudServicio iTipoSolicitudServicio;
	
	/** Constante que representa la instancia del Log. */
	private static final Logger LOG = LoggerFactory.getLogger(RegistrarQuejaAerolinea.class);
	
	/**
	 * Inyeccion EJB del servicio transversal LogError
	 */
	@EJB
	private ILogError logError;


	/**
	 * Método para hacer guardar una queja.
	 * @param quejaAerolinea entidad 
	 * @throws LogicaExcepcion   Excepción Lógica
	 * 
	 */
	@Override
	public void guardarQueja(QuejaAerolinea quejaAerolinea) throws LogicaExcepcion {
		
		
		try {
			
			//Generar los datos de respuesta, datos de salida 1, 2, 3, 8, 
			obtenerInformacionRespuesta(quejaAerolinea);
			
			//Guardar entidades 
			quejaAerolineaServicio.guardar(quejaAerolinea);
			
			// CU-0106 Generar Notificación (Destinatario: Responsable
			// de los Certificado de Aptitud Técnica)
			/*enviarNotificacion(
					ConstantesValidacion.DESTINATARIO_NOTIFICACION_RESPONSABLE,
					certificadoAptec);*/
			// CU-0106 Generar Notificación (Destinatario: Gestor
			// Responsable)
			/*enviarNotificacion(
					ConstantesValidacion.DESTINATARIO_NOTIFICACION_GESTOR,
					certificadoAptec);*/
			
			
    		sistemaDeArchivoServicio.obtenerRecurso("/");
			generarNumeroDeQueja();
			guardarEntidades();
		} catch (LogicaExcepcion ex) {
			LOG.error(mensaje.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_GUARDAR_INGRESAR_CERTIFICADO)
					+ ". " + ex.getMessage());
			throw new LogicaExcepcion(ex.getMessage());
		}
		// TODO Auto-generated method stub
	}
	
	/**
	 * Método para obtener información de respuesta a la solicitud,
	 * datos de salida 1, 2, 3, 8, 9 y 10
	 * 
	 * @param quejaAerolinea que se va a guardar en la bd.
	 * @throws LogicaExcepcion   Excepción Lógica
	 */
	private void obtenerInformacionRespuesta(QuejaAerolinea quejaAerolinea) throws LogicaExcepcion {
		Estado estadoRadicado = null;
		try {
			// CU-0091 Obtener Número de Radicado, para obtener dato de salida 1.
			Long numeroADI = adiServicio.obtenerNumeroDeRadicado("", "", "", "");
			if (numeroADI == null || numeroADI == 0) {
				throw new LogicaExcepcion(ConstantesValidacion.ERROR_BUSCAR_NUMERO_ADI);
			}
			quejaAerolinea.setRadicadoAdi(numeroADI);
			
			//CU-0585 Generar Clave de Consulta
			quejaAerolinea.setClaveConsulta(codigoServicio.generarClaveDeConsulta());
			
			// Obtener tipo de solicitud en indice de solicitud
			TipoSolicitud tipoSolicitud = obtenerTipoSolicitud(ConstantesValidacion.TIPO_SOLICITUD_CODIGO);
			
			// Establece el usuario que va a aceptar o rechazar la solicitud, datos de salida 8, 9 y 10.
			Persona personaGestor = responsableServicio.obtenerResponsableGestion(ConstantesValidacion.CODIGO_ESTADO_SOLICITUD_RADICADA, tipoSolicitud);
			quejaAerolinea.setResponsable(personaGestor);
			
			//Obtener el dato de salida 5
			estadoRadicado = quejaAerolineaServicio.obtenerEstadoQuejaAerolinea(ConstantesValidacion.CODIGO_ESTADO_SOLICITUD_RADICADA);
			quejaAerolinea.setEstadoQueja(estadoRadicado);
		} catch (LogicaExcepcion ex) {
			LOG.error(mensaje.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_GUARDAR_INGRESAR_CERTIFICADO)
					+ ". " + ex.getMessage());
			throw new LogicaExcepcion(ex.getMessage());
		}
	}
	
	/**
	 * Obtiene el tipo estado de la solicitud
	 * (RADICADA,ACEPTADA,RECHAZADA,SUSPENDIDA)
	 * 
	 * @param codigoTipoSolicitud
	 *            codigo tipo de solicitud
	 * @return TipoEstado de la solicitud
	 */
	public TipoSolicitud obtenerTipoSolicitud(String codigoTipoSolicitud) {
		TipoSolicitud tipoSolicitud = new TipoSolicitud();
		tipoSolicitud.setCodigo(codigoTipoSolicitud);
		List<TipoSolicitud> tipos;
		try {
			tipos = iTipoSolicitudServicio.buscarPorCriterio(tipoSolicitud);
			LOG.info("obtenerTipoSolicitud | tipos: " + tipos);
			if (tipos != null && tipos.size() > 0) {
				for (TipoSolicitud tipo : tipos) {
					if (codigoTipoSolicitud.equals(tipo.getCodigo())) {
						tipoSolicitud = tipo;
					}
				}
			}
		} catch (LogicaExcepcion e) {
			logError.log(
					"ERROR LogicaExcepcion AL OBTENER TIPO SOLICITUD "
							+ e.getMessage(), LOG);
			throw new SistemaExcepcion(
					"ERROR LogicaExcepcion AL OBTENER TIPO ESTADO SOLICITUD "
							+ e.getMessage(), e);
		}
		LOG.info("obtenerTipoEstadoSolicitud | tipoEstado: "
				+ tipoSolicitud.getNombre());
		return tipoSolicitud;
	}
	
	/**
	 * Método para guardar entidades relacionadas con la solicitud.
	 * 
	 */
	private void guardarEntidades() {
		//TODO
	}
	
	/**
	 * Método para obtener el numero de queja.
	 * 
	 */
	private void generarNumeroDeQueja() {
		//TODO
	}


}
